package demo.topic13;

import org.junit.Test;

import java.util.*;

/**
 * 泛型对集合类特别有用
 */
public class GenericDemo {

    @Test
    public void test1() {
        List list = new ArrayList<>();
        list.add("大黄狗1");
        list.add(1);
        list.add(new Object());

        for (int i = 0; i < list.size(); i++) {
            // 如果我们不能确定集合中的元素类型，那么我们需要在处理元素时
            // 要判断元素的类型，才能做相应的操作
            System.out.println(list.get(i));
        }
    }
    
    @Test
    public void test2() {
        Node<Integer> integerNode = new Node<>(2);
        Node<String> stringNode = new Node<>("大黄狗2");

        System.out.println(integerNode.getData());
        System.out.println(stringNode.getData());
    }

    /**
     * 通配符 ?
     */
    @Test
    public void test3() {
        Node<Integer> integerNode = new Node<>(3);
        Node<String> stringNode = new Node<>("大黄狗3");

        getData(integerNode);
        getData(stringNode);

    }

    /**
     * 使用通配符定义泛型类型
     * 只能获取值，不能修改值
     * @param node
     */
    private void getData(Node<?> node) {
        System.out.println(node.getData());
    }

    /**
     * 泛型方法的调用
     */
    @Test
    public void test4() {
        String[] arr = {"aaa", "bbb", "ccc"};
        String[] newArr = exchange(arr, 0, 1);
        System.out.println(newArr.toString());
    }

    private <T> T[] exchange(T[] arr, int i, int j) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        return arr;
    }

    /**
     * 泛型的嵌套使用
     * Set<Map.Entry<Integer, String>> entries = map.entrySet()
     */
    @Test
    public void test5() {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "大黄狗");
        map.put(2, "黄色");

        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            System.out.println(entry.getKey()+"-"+entry.getValue());
        }

    }
}
